home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / ab20 / ab20_archive / utilities / emulators / unixlib.lzh / file.c < prev    next >
C/C++ Source or Header  |  1991-10-17  |  5KB  |  215 lines

  1. #include <sys/dir.h>
  2. #include <libraries/dosextens.h>
  3. #include <stat.h>
  4.  
  5. char *convert(char *);
  6.  
  7. /* I want to change the original sources as little as possible, so I decided
  8.  * that all my functions should work with Amiga filenames. Most of the code
  9.  * I copied from someone else, I only changed opendir()
  10.  *                    Cthulu
  11.  */
  12.  
  13. /*
  14.  * BSD/Unix expansion library for Amiga.
  15.  *
  16.  * closedir() -- system independent directory code
  17.  */
  18.  
  19. void
  20. closedir(my_dir)
  21.    DIR *my_dir;
  22. {
  23.     UnLock(my_dir->d_lock);
  24.     FreeMem(my_dir, sizeof(DIR));
  25. }
  26.  
  27.  
  28. /*
  29.  * BSD/Unix expansion library for Amiga.
  30.  *
  31.  * readdir() -- system independent directory code
  32.  */
  33.  
  34.  
  35. struct direct *
  36. readdir(my_dir)
  37.    DIR *my_dir;
  38. {
  39.     static struct direct    result ;
  40.  
  41.     if (!ExNext(my_dir->d_lock, &(my_dir->d_info)))
  42.         return NULL ;
  43.  
  44.     result.d_reclen = result.d_ino = 1;    /* Not NULL! */
  45.     (void) strcpy(result.d_name, my_dir -> d_info.fib_FileName);
  46.     result.d_namlen = strlen(result.d_name);
  47.     return &result ;
  48. }
  49.  
  50. /*
  51.  * BSD/Unix expansion library for Amiga.
  52.  *
  53.  * rewinddir() -- system independent directory code
  54.  */
  55.  
  56.  
  57. void
  58. rewinddir(my_dir)
  59.    DIR *my_dir;
  60. {
  61.     if (!Examine(my_dir->d_lock, &(my_dir->d_info)))
  62.         setmem((char *) my_dir, sizeof(DIR), 0) ;
  63. }
  64.  
  65. /*
  66.  * BSD/Unix expansion library for Amiga.
  67.  *
  68.  * seekdir() -- system independent directory code
  69.  */
  70.  
  71.  
  72. /*
  73.  * telldir and seekdir don't work quite right. The problem is that you have
  74.  * to save more than a long's worth of stuff to indicate position, and it's
  75.  * socially unacceptable to alloc stuff that you don't free later under
  76.  * AmigaDOS. So we fake it - you get one level of seek, and dat's all.
  77.  * As of now, these things are untested.
  78.  */
  79.  
  80. #define DIR_SEEK_RETURN        ((long) 1)    /* Not 0! */
  81.  
  82. void
  83. seekdir(my_dir, where)
  84.    DIR *my_dir;
  85.    long where;
  86. {
  87.     if (where == DIR_SEEK_RETURN)
  88.         my_dir->d_info = my_dir->d_seek ;
  89.     else    /* Makes the next readdir fail */
  90.         setmem((char *) my_dir, sizeof(DIR), 0) ;
  91. }
  92.  
  93. /*
  94.  * BSD/Unix expansion library for Amiga.
  95.  *
  96.  * telldir() -- system independent directory code
  97.  */
  98.  
  99.  
  100. /*
  101.  * telldir and seekdir don't work quite right. The problem is that you have
  102.  * to save more than a long's worth of stuff to indicate position, and it's
  103.  * socially unacceptable to alloc stuff that you don't free later under
  104.  * AmigaDOS. So we fake it - you get one level of seek, and dat's all.
  105.  * As of now, these things are untested.
  106.  */
  107.  
  108. #define DIR_SEEK_RETURN        ((long) 1)    /* Not 0! */
  109. long
  110. telldir(my_dir)
  111.    DIR *my_dir;
  112. {
  113.     my_dir->d_seek = my_dir->d_info ;
  114.     return (long) DIR_SEEK_RETURN ;
  115. }
  116.  
  117.  
  118.  
  119. /*
  120.  * BSD/Unix expansion library for Amiga.
  121.  *
  122.  * opendir() -- system independent directory code
  123.  */
  124.  
  125.  
  126. DIR *
  127. opendir(dirname)
  128.    char *dirname;
  129. {
  130.     register DIR    *my_dir, *AllocMem(/* int, int */) ;
  131.     struct FileLock    *Lock(/* char *, int */), *CurrentDir(/* struct FileLock * */) ;
  132.  
  133.     if ((my_dir = AllocMem(sizeof(DIR), 0)) == NULL)
  134.         return NULL ;
  135.  
  136.     if (((my_dir->d_lock = Lock(convert(dirname), ACCESS_READ)) == NULL)
  137.         /* If we can't examine it */
  138.         ||  !Examine(my_dir->d_lock, &(my_dir->d_info))
  139.         /* Or it's not a directory */
  140.         ||  (my_dir->d_info.fib_DirEntryType < 0))
  141.     {
  142.         FreeMem(my_dir, sizeof(DIR)) ;
  143.         return NULL ;
  144.     }
  145.     return my_dir ;
  146. }
  147.  
  148.  
  149. /* convert UNIX path-name to AMIGA
  150.  * check_file_name generates a path which ends with .
  151.  * this function changes the original string !!!!
  152.  */
  153. char *convert(char unix_name[])
  154. {
  155.     int lastpos;
  156.     lastpos = strlen(unix_name) -1;
  157.     if(lastpos == 0) /* '.' */
  158.      unix_name[0] = '\0';   /*  mudlib:  */
  159.     else
  160.     {
  161.     if(unix_name[lastpos] == '.')
  162.         unix_name[lastpos] = '\0';
  163.     }
  164.     return unix_name;
  165. }
  166.  
  167.  
  168. /* remove directory, return -1 if failed.
  169.  * file is an Unix-path !!!
  170.  */
  171. int rmdir(file)
  172.     char *file;
  173. {
  174.     if(!isdir(convert(file)))
  175.         return -1;
  176.     if(!DeleteFile(file))
  177.         return -1;   /* does not exist or if directory: not empty */
  178.     else
  179.         return 0;
  180. }
  181.  
  182. /* this function was defined in simulate.c too, but I had already written this,
  183.  * so remove the original isdir, and replace it with this code.
  184.  */
  185. int isdir(file)
  186.     char *file;
  187. {
  188.     struct FileInfoBlock *infoBlock;
  189.     int s_isdir;
  190.     struct FileLock    *lock, *Lock(/* char *, int */);
  191.  
  192.     if(file[0] == '.' && strlen(file) == 1)
  193.     return 1;    /* mudlib: is een directory */
  194.  
  195.     lock = Lock(file, ACCESS_READ);
  196.     if(lock) {
  197.         infoBlock = (struct FileInfoBlock *) 
  198.                               AllocMem(sizeof(struct FileInfoBlock), 0L);
  199.         if(infoBlock) {
  200.             if( Examine(lock, (BPTR)infoBlock))
  201.         s_isdir = (infoBlock->fib_DirEntryType  < 0) ? 0 : 1;
  202.             FreeMem(infoBlock, sizeof(struct FileInfoBlock));
  203.         }
  204.     UnLock(lock);
  205.     }
  206.     return s_isdir;
  207. }
  208.  
  209. /* lstat gives different information about a linked file than stat does,
  210.  * but Amiga has no links, so just return stat()
  211.  */
  212. int lstat(char *file, struct stat *data) {
  213.     return stat(file, data);
  214. }
  215.